const axios = require('axios');
const AlipayFormData = require('alipay-sdk/lib/form').default;
const alipay = require('./alipay/index.js');
const multer = require('multer');
//  配置文件保存的目录
const storage = multer.diskStorage({
    // 上传的文件目录
    destination: function (req, file, cd) {
        cd(null, path.join(__dirname, 'public'))
    },
    // 上传文件的名称
    filename: function (req, file, cd) {
        cd(null, file.originalname)
    }
});
// 应用配置
const upload = multer({ storage })
// 拿到数据放到空白文件中
const fs = require('fs');
const path = require('path');
//导入 express
const express = require('express');
//创建 应用对象
const app = express();
app.use(express.json({ limit: '4mb' }));
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, 'public')));
//创建路由规则 见3、4
//利用 app.listen(端口号、回调函数)；监听端口  启动服务器
let host = 8003;
app.listen(host, () => {
    console.log(`express server running at http://127.0.0.1:${host}`)
    console.log(`${host}端口监听中`)
})
app.all('*', function (req, res, next) {
    // 允许跨域
    res.header("Access-Control-Allow-Origin", "*");
    // 允许携带自定义请求头信息
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    // 支持接收的请求类型
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
    res.header("X-Powered-By", ' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});
app.post('/api', upload.single('picture'), function (reqest, response) {
    /*处理函数*/
    reqest.body.picture = reqest.file.originalname;
    var datas = JSON.stringify(reqest.body);
    var name = reqest.body.name;
    var passwords = reqest.body.password;
    var pathurl = path.join(__dirname, `${name}.json`);
    fs.writeFile(pathurl, datas, function (err) {
        if (err == null) {
            console.log('写入成功');
            return;
        }
        console.log(err);
        response.send('no');
    });
    // 写入用户表
    var userpath = path.join(__dirname, `user.json`);
    fs.readFile(userpath, 'utf-8', function (err, dataStr) {
        if (err == null) {
            console.log('读取用户列表成功'); //当接收到的err 为 null 时，表示文件读取成功；
            var data = dataStr == null ? [] : JSON.parse(dataStr);
            var i = data.findIndex((item) => {
                return item.name == name;
            })
            if (i == -1) {
                data[data.length] = {
                    name,
                    password: passwords,
                };
            } else {
                data[i].password = passwords;
            }
            data = JSON.stringify(data);
            fs.writeFile(userpath, data, function (err) {
                if (err == null) {
                    console.log('用户写入成功');
                    return;
                }
                console.log(err);
            })
        } else {
            console.log(err);
            response.send('no');
        }
    });
    response.send('ok');
})
app.post('/recompose', function (reqest, response) {
    /*处理函数*/
    var datas = JSON.stringify(reqest.body);
    var name = reqest.body.name;
    var passwords = reqest.body.password;
    var pathurl = path.join(__dirname, `${name}.json`);
    fs.writeFile(pathurl, datas, function (err) {
        if (err == null) {
            console.log('写入成功');
            return;
        }
        console.log(err);
        response.send('no');
    });
    response.send('ok');
})

app.post('/data', function (reqest, response) {
    /*处理函数*/
    var namer = reqest.body.name
    var password = reqest.body.password;
    var pathurl = path.join(__dirname, `user.json`)
    fs.readFile(pathurl, 'utf-8', function (err, dataStr) {
        if (err == null) {
            console.log('读取文件成功'); //当接收到的err 为 null 时，表示文件读取成功；
            var data = JSON.parse(dataStr);
            var index = data.findIndex((i) => {
                return i.name == namer;
            })
            if (index != -1 && password == data[index].password) {
                var namerurl = path.join(__dirname, `${namer}.json`)
                fs.readFile(namerurl, 'utf-8', function (err, dataStr) {
                    if (err == null) {
                        console.log('读取用户文件成功'); //当接收到的err 为 null 时，表示文件读取成功；
                        var datas = JSON.parse(dataStr);
                        response.send(datas);
                        return;
                    }
                })
            } else {
                response.send('no');
            }
        } else {
            response.send('no');
        }

    })
})


app.post('/adimin', function (reqest, response) {
    /*处理函数*/
    var userpath = path.join(__dirname, `user.json`);
    fs.readFile(userpath, 'utf-8', function (err, dataStr) {
        if (err == null) {
            console.log('读取用户表成功'); //当接收到的err 为 null 时，表示文件读取成功；
            response.send(dataStr);
            return;
        }
        console.log(err);
        response.send('no');
    });
})
fs.readFile(path.join(__dirname, `user.json`), 'utf-8', function (err, dataStr) {
    if (err == null) {
        console.log('读取用户表成功'); //当接收到的err 为 null 时，表示文件读取成功；
        return;
    }
    console.log(err);
});
app.post('/chang', function (reqest, response) {
    uersdata = JSON.stringify(reqest.body)
    var userpath = path.join(__dirname, `user.json`);
    fs.writeFile(userpath, uersdata, function (err) {
        if (err == null) {
            console.log('用户写入成功');
            response.send('ok')
            return;
        }
        console.log(err);
        response.send('no')
    })
});
app.post('/love', function (reqest, response) {
    uersdata = JSON.stringify(reqest.body)
    var userpath = path.join(__dirname, `love.json`);
    fs.writeFile(userpath, uersdata, function (err) {
        if (err == null) {
            console.log(uersdata);
            response.send('love成功')
            return;
        }
        console.log("love出错了");
        response.send('love出错了')
    })
});

app.post('/remove', function (reqest, response) {
    username = reqest.body[0];
    var userpath = path.join(__dirname, `${username}.json`);
    fs.unlink(userpath, function (err) {
        if (err == null) {
            console.log(`删除${username}成功`);
            response.send('ok')
            return;
        }
        console.log(err);
    })
});


// 说明
//   - /data    用户登录判断-读取并返回数据
//   - /api     用户注册-信息写入文件    追加用户列表的数据
//   - /adimin  返回列表用户信息
//   - /chang   重写用户信息数据
//   - /remove  删除对应用户的文件 接收名字即可

// 创建订单
app.post('/alipay', async function (req, res) {
    const formData = new AlipayFormData()
    formData.setMethod('get');
    // 成功之后的异步通知地址 notifyUrl
    // formData.addField('notifyUrl', 'http://wudetian.top');
    // 成功之后的同步通知地址
    // formData.addField('returnUrl', 'http://wudetian.top');
    formData.addField('bizContent', {
        outTradeNo: req.body.id, // 商户订单号，确保商户端唯一
        productCode: 'FACE_TO_FACE_PAYMENT', // 固定的，不同支付方式该值不同
        totalAmount: "5.00", //总金额
        subject: '定制开发', //商品标题
        body: req.body.name, //商品详情
    });
    // 生成支付信息
    const result = await alipay.exec('alipay.trade.precreate', {}, { formData });
    // 从官方文档看到，result 包含 tradeNo、outTradeNo 2 个 key
    await axios({
        // 请求方法
        method: "get",
        // 请求url
        url: result,
    }).then(response => {
        let url = response.data.alipay_trade_precreate_response.qr_code
        console.log(response.data);
        res.send(url);
    }).catch(err => {
        // 处理错误信息
        console.error(err);
        res.send(err)
    })


})

// 交易查询
app.post('/alipayOver', async function (req, res) {
    const formData = new AlipayFormData();
    formData.setMethod('get');
    formData.addField('bizContent', {
        out_trade_no: req.body.id,
    });
    // 生成支付信息
    const result = await alipay.exec('alipay.trade.query', {}, { formData });
    // 从官方文档看到，result 包含 tradeNo、outTradeNo 2 个 key
    await axios({
        // 请求方法
        method: "get",
        // 请求url
        url: result,
    }).then(response => {
        let msg = response.data.alipay_trade_query_response.sub_msg;
        let code = response.data.alipay_trade_query_response.code;
        if (code == 10000) {
            let status = response.data.alipay_trade_query_response.trade_status;
            switch (status) {
                case 'WAIT_BUYER_PAY':
                    reqmsg = '未付款';
                    break;
                case 'TRADE_CLOSED':
                    reqmsg = '交易超时,已退款';
                    break;
                case 'TRADE_SUCCESS':
                    reqmsg = '支付成功';
                    break;
                case 'TRADE_FINISHED':
                    reqmsg = '支付成功';
                    break;
                default:
                    reqmsg = '交易失败';
            }
        } else {
            reqmsg = msg;
        }
        console.log(reqmsg);
        res.send(reqmsg);
    }).catch(err => {
        // 处理错误信息
        console.error(err);
        res.send('出错了')
    })
})